home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / var / lib / python-support / python2.6 / glchess / gtkui / gtkui.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  32.2 KB  |  921 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __author__ = 'Robert Ancell <bob27@users.sourceforge.net>'
  5. __license__ = 'GNU General Public License Version 2'
  6. __copyright__ = 'Copyright 2005-2006  Robert Ancell'
  7. __all__ = [
  8.     'GtkUI']
  9. import os
  10. import sys
  11. import time
  12. from gettext import gettext as _
  13. import gobject
  14. import gtk
  15. import gtk.glade as gtk
  16. import gtk.gdk as gtk
  17. import cairo
  18. import pango
  19. from glchess.defaults import *
  20. import LaunchpadIntegration
  21. os.environ['PYGTK_FATAL_EXCEPTIONS'] = '1'
  22. import glchess.config as glchess
  23. import glchess.ui as glchess
  24. import glchess.chess.board as glchess
  25. import dialogs
  26. import log
  27. import chessview
  28. import network
  29. gtk.window_set_default_icon_name(ICON_NAME)
  30.  
  31. def loadGladeFile(name, root = None):
  32.     return gtk.glade.XML(os.path.join(GLADE_DIR, name), root, domain = DOMAIN)
  33.  
  34.  
  35. class GLibTimer(glchess.ui.Timer):
  36.     '''
  37.     '''
  38.     
  39.     def __init__(self, ui, feedback, duration):
  40.         self.ui = ui
  41.         self.feedback = feedback
  42.         self.tickTime = 0
  43.         self.reportedTickTime = 0
  44.         self.timer = None
  45.         self.tickTimer = None
  46.         self.startTime = None
  47.         self.set(duration * 1000)
  48.  
  49.     
  50.     def set(self, duration):
  51.         '''
  52.         '''
  53.         if self.timer is not None:
  54.             gobject.source_remove(self.timer)
  55.         
  56.         if self.tickTimer is not None:
  57.             gobject.source_remove(self.tickTimer)
  58.         
  59.         self.duration = duration
  60.         self.consumed = 0
  61.  
  62.     
  63.     def __consumed(self, now):
  64.         if self.startTime is None:
  65.             return self.consumed
  66.         return self.consumed + (now - self.startTime)
  67.  
  68.     
  69.     def getRemaining(self):
  70.         '''Extends ui.Timer'''
  71.         return self.duration - self._GLibTimer__consumed(int(1000 * time.time()))
  72.  
  73.     
  74.     def pause(self):
  75.         '''Extends ui.Timer'''
  76.         if self.timer is None:
  77.             return None
  78.         self.consumed = self._GLibTimer__consumed(int(1000 * time.time()))
  79.         gobject.source_remove(self.timer)
  80.         if self.tickTimer is not None:
  81.             gobject.source_remove(self.tickTimer)
  82.         
  83.         self.timer = None
  84.         self.tickTimer = None
  85.  
  86.     
  87.     def run(self):
  88.         '''Extends ui.Timer'''
  89.         if self.timer is not None:
  90.             return None
  91.         self.startTime = int(1000 * time.time())
  92.         self.timer = gobject.timeout_add(self.duration - self.consumed, self._GLibTimer__expired)
  93.         self._GLibTimer__setSecondTimer(self.startTime)
  94.  
  95.     
  96.     def __setSecondTimer(self, now):
  97.         '''Set a timer to expire on the next second boundary'''
  98.         if not self.tickTimer is None:
  99.             raise AssertionError
  100.         consumed = self._GLibTimer__consumed(now)
  101.         t = 1000 * (consumed / 1000 + 1)
  102.         if t <= self.reportedTickTime:
  103.             self.tickTime = self.reportedTickTime + 1000
  104.         else:
  105.             self.tickTime = t
  106.         if self.tickTime > self.duration:
  107.             self.tickTimer = None
  108.         else:
  109.             self.tickTimer = gobject.timeout_add(self.tickTime - consumed, self._GLibTimer__tick)
  110.  
  111.     
  112.     def __expired(self):
  113.         '''Called by GLib main loop'''
  114.         self.feedback.onTick(0)
  115.         self.feedback.onExpired()
  116.         if self.tickTimer is not None:
  117.             gobject.source_remove(self.tickTimer)
  118.         
  119.         self.timer = None
  120.         self.tickTimer = None
  121.         return False
  122.  
  123.     
  124.     def __tick(self):
  125.         '''Called by GLib main loop'''
  126.         self.reportedTickTime = self.tickTime
  127.         self.feedback.onTick((self.duration - self.tickTime) / 1000)
  128.         self.tickTimer = None
  129.         self._GLibTimer__setSecondTimer(int(1000 * time.time()))
  130.         return False
  131.  
  132.     
  133.     def delete(self):
  134.         '''Extends ui.Timer'''
  135.         gobject.source_remove(self.timer)
  136.  
  137.  
  138.  
  139. class GtkUI(glchess.ui.UI):
  140.     '''
  141.     '''
  142.     _gui = None
  143.     __lastTime = None
  144.     __animationTimer = None
  145.     __playerModel = None
  146.     __aboutDialog = None
  147.     __saveGameDialogs = None
  148.     __renderGL = False
  149.     openGLInfoPrinted = False
  150.     __joinGameDialogs = None
  151.     __networkGames = None
  152.     __defaultWhiteAI = None
  153.     __defaultBlackAI = None
  154.     __attentionCounter = 0
  155.     whiteTimeString = '\xe2\x88\x9e'
  156.     blackTimeString = '\xe2\x88\x9e'
  157.     width = None
  158.     height = None
  159.     isFullscreen = False
  160.     isMaximised = False
  161.     view = None
  162.     
  163.     def __init__(self, feedback):
  164.         '''Constructor for a GTK+ glChess GUI'''
  165.         self.feedback = feedback
  166.         self._watches = { }
  167.         self._GtkUI__networkGames = { }
  168.         self.newGameDialog = None
  169.         self.loadGameDialog = None
  170.         self._GtkUI__saveGameDialogs = { }
  171.         self._GtkUI__joinGameDialogs = []
  172.         tooltip = gtk.Tooltips()
  173.         tooltip.force_window()
  174.         if hasattr(tooltip, 'tip_window') and tooltip.tip_window != None:
  175.             tooltip.tip_window.ensure_style()
  176.             self._tooltipStyle = tooltip.tip_window.get_style()
  177.         else:
  178.             self._tooltipStyle = None
  179.         self._tooltipWidgetsDrawn = { }
  180.         self._gui = loadGladeFile('glchess.glade')
  181.         self._gui.signal_autoconnect(self)
  182.         self.mainWindow = self._gui.get_widget('glchess_app')
  183.         self._GtkUI__getWidget('toolbar').unset_style()
  184.         self._GtkUI__playerModel = gtk.ListStore(str, str, str)
  185.         iter = self._GtkUI__playerModel.append()
  186.         self._GtkUI__playerModel.set(iter, 0, '', 1, 'stock_person', 2, _('Human'))
  187.         self._GtkUI__logWindow = log.LogWindow(self._gui.get_widget('log_notebook'))
  188.         self.preferences = dialogs.GtkPreferencesDialog(self)
  189.         group = gtk.SizeGroup(gtk.SIZE_GROUP_BOTH)
  190.         group.add_widget(self._GtkUI__getWidget('left_nav_box'))
  191.         group.add_widget(self._GtkUI__getWidget('right_nav_box'))
  192.         combo = self._GtkUI__getWidget('history_combo')
  193.         cell = gtk.CellRendererText()
  194.         combo.pack_start(cell, False)
  195.         combo.add_attribute(cell, 'text', 2)
  196.         widget = self._gui.get_widget('help2_menu')
  197.         LaunchpadIntegration.set_sourcepackagename('gnome-games')
  198.         LaunchpadIntegration.add_items(widget, 1, True, False)
  199.         self._updateViewButtons()
  200.         for key in [
  201.             'show_toolbar',
  202.             'show_history',
  203.             'fullscreen',
  204.             'show_3d',
  205.             'show_3d_smooth',
  206.             'show_comments',
  207.             'show_numbering',
  208.             'show_move_hints',
  209.             'width',
  210.             'height',
  211.             'move_format',
  212.             'promotion_type',
  213.             'board_view',
  214.             'enable_networking']:
  215.             glchess.config.watch(key, self._GtkUI__applyConfig)
  216.         
  217.  
  218.     
  219.     def setTooltipStyle(self, widget):
  220.         """Set a widget to be in the tooltip style.
  221.         
  222.         'widget' is the widget to modify.
  223.         """
  224.         if self._tooltipStyle is None:
  225.             return None
  226.         widget.set_style(self._tooltipStyle)
  227.         widget.connect('expose_event', self._on_tooltip_expose_event)
  228.         widget.queue_draw()
  229.  
  230.     
  231.     def _on_tooltip_expose_event(self, widget, event):
  232.         '''Gtk+ callback'''
  233.         allocation = widget.allocation
  234.         widget.style.paint_flat_box(widget.window, gtk.STATE_NORMAL, gtk.SHADOW_OUT, None, widget, 'tooltip', allocation.x, allocation.y, allocation.width, allocation.height)
  235.         if not self._tooltipWidgetsDrawn.has_key(widget):
  236.             self._tooltipWidgetsDrawn[widget] = True
  237.             widget.queue_draw()
  238.         
  239.  
  240.     
  241.     def watchFileDescriptor(self, fd):
  242.         '''Extends ui.UI'''
  243.         self._watches[fd] = gobject.io_add_watch(fd, gobject.IO_IN | gobject.IO_PRI | gobject.IO_HUP | gobject.IO_ERR, self._GtkUI__readData)
  244.  
  245.     
  246.     def unwatchFileDescriptor(self, fd):
  247.         '''Extends ui.UI'''
  248.         gobject.source_remove(self._watches.pop(fd))
  249.  
  250.     
  251.     def writeFileDescriptor(self, fd):
  252.         '''Extends ui.UI'''
  253.         gobject.io_add_watch(fd, gobject.IO_OUT, self._GtkUI__writeData)
  254.  
  255.     
  256.     def addTimer(self, feedback, duration):
  257.         '''Extends ui.UI'''
  258.         return GLibTimer(self, feedback, duration)
  259.  
  260.     
  261.     def __timerExpired(self, method):
  262.         method()
  263.         return True
  264.  
  265.     
  266.     def __readData(self, fd, condition):
  267.         return self.feedback.onReadFileDescriptor(fd)
  268.  
  269.     
  270.     def __writeData(self, fd, condition):
  271.         return self.feedback.onWriteFileDescriptor(fd)
  272.  
  273.     
  274.     def addAIEngine(self, name):
  275.         """Register an AI engine.
  276.         
  277.         'name' is the name of the engine.
  278.         TODO: difficulty etc etc
  279.         """
  280.         iter = self._GtkUI__playerModel.append()
  281.         self._GtkUI__playerModel.set(iter, 0, name, 1, 'stock_notebook', 2, name)
  282.         if self._GtkUI__defaultBlackAI is None:
  283.             self._GtkUI__defaultBlackAI = name
  284.         
  285.  
  286.     
  287.     def setView(self, title, feedback, isPlayable = True):
  288.         '''Extends ui.UI'''
  289.         moveFormat = glchess.config.get('move_format')
  290.         showComments = glchess.config.get('show_comments')
  291.         self.view = chessview.GtkView(self, feedback, moveFormat = moveFormat, showComments = showComments)
  292.         self.view.setTitle(title)
  293.         self.view.isPlayable = isPlayable
  294.         self.view.viewWidget.setRenderGL(self._GtkUI__renderGL)
  295.         viewport = self._GtkUI__getWidget('game_viewport')
  296.         child = viewport.get_child()
  297.         if child is not None:
  298.             viewport.remove(child)
  299.         
  300.         viewport.add(self.view.widget)
  301.         self._updateViewButtons()
  302.         if self.view is not None:
  303.             self.setTimers(self.view.whiteTime, self.view.blackTime)
  304.         
  305.         return self.view
  306.  
  307.     
  308.     def updateTitle(self):
  309.         '''
  310.         '''
  311.         if self.view is not None and len(self.view.title) > 0:
  312.             if self.view.needsSaving:
  313.                 title = _('Chess - *%(game_name)s') % {
  314.                     'game_name': self.view.title }
  315.             else:
  316.                 title = _('Chess - %(game_name)s') % {
  317.                     'game_name': self.view.title }
  318.         else:
  319.             title = _('Chess')
  320.         self.mainWindow.set_title(title)
  321.  
  322.     
  323.     def addLogWindow(self, title, executable, description):
  324.         '''
  325.         '''
  326.         return self._GtkUI__logWindow.addView(title, executable, description)
  327.  
  328.     
  329.     def setTimers(self, whiteTime, blackTime):
  330.         '''
  331.         '''
  332.         unlimitedTimeText = _('\xe2\x88\x9e')
  333.         if whiteTime is None:
  334.             whiteString = unlimitedTimeText
  335.         else:
  336.             t = whiteTime[1]
  337.             whiteString = '%i:%02i' % (t / 60, t % 60)
  338.         if blackTime is None:
  339.             blackString = unlimitedTimeText
  340.         else:
  341.             t = blackTime[1]
  342.             blackString = '%i:%02i' % (t / 60, t % 60)
  343.         if whiteString != self.whiteTimeString:
  344.             self.whiteTimeString = whiteString
  345.             self._gui.get_widget('white_time_label').queue_draw()
  346.         
  347.         if blackString != self.blackTimeString:
  348.             self.blackTimeString = blackString
  349.             self._gui.get_widget('black_time_label').queue_draw()
  350.         
  351.  
  352.     
  353.     def run(self):
  354.         '''Run the UI.
  355.         
  356.         This method will not return.
  357.         '''
  358.         for name in [
  359.             'show_toolbar',
  360.             'show_history',
  361.             'show_3d',
  362.             'show_3d_smooth',
  363.             'show_comments',
  364.             'show_numbering',
  365.             'show_move_hints',
  366.             'move_format',
  367.             'promotion_type',
  368.             'board_view',
  369.             'maximised',
  370.             'enable_networking']:
  371.             
  372.             try:
  373.                 value = glchess.config.get(name)
  374.             except glchess.config.Error:
  375.                 continue
  376.  
  377.             self._GtkUI__applyConfig(name, value)
  378.         
  379.         self._GtkUI__resize()
  380.         self.mainWindow.show()
  381.         self._GtkUI__applyConfig('fullscreen', glchess.config.get('fullscreen'))
  382.         gtk.main()
  383.  
  384.     
  385.     def reportGameLoaded(self, game):
  386.         '''Extends glchess.ui.UI'''
  387.         dialogs.GtkNewGameDialog(self, self._GtkUI__playerModel, game)
  388.  
  389.     
  390.     def addNetworkDialog(self, feedback):
  391.         '''Extends glchess.ui.UI'''
  392.         self._GtkUI__networkDialog = network.GtkNetworkGameDialog(self, feedback)
  393.         return self._GtkUI__networkDialog
  394.  
  395.     
  396.     def addNetworkGame(self, name, game):
  397.         '''Extends glchess.ui.UI'''
  398.         self._GtkUI__networkDialog.addNetworkGame(name, game)
  399.  
  400.     
  401.     def removeNetworkGame(self, game):
  402.         '''Extends glchess.ui.UI'''
  403.         self._GtkUI__networkDialog.removeNetworkGame(game)
  404.  
  405.     
  406.     def requestSave(self, title):
  407.         '''Extends glchess.ui.UI'''
  408.         dialog = gtk.MessageDialog(flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, type = gtk.MESSAGE_WARNING, message_format = title)
  409.         dialog.format_secondary_text(_("If you don't save the changes to this game will be permanently lost"))
  410.         dialog.add_button(_('Close _without saving'), gtk.RESPONSE_OK)
  411.         dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)
  412.         dialog.add_button(gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT)
  413.         response = dialog.run()
  414.         dialog.destroy()
  415.         if response == gtk.RESPONSE_ACCEPT:
  416.             return glchess.ui.SAVE_YES
  417.         if response == gtk.RESPONSE_OK:
  418.             return glchess.ui.SAVE_NO
  419.         return glchess.ui.SAVE_ABORT
  420.  
  421.     
  422.     def close(self):
  423.         '''Extends glchess.ui.UI'''
  424.         if self.width is not None:
  425.             glchess.config.set('width', self.width)
  426.         
  427.         if self.height is not None:
  428.             glchess.config.set('height', self.height)
  429.         
  430.  
  431.     
  432.     def _incAttentionCounter(self, offset):
  433.         '''
  434.         '''
  435.         self._GtkUI__attentionCounter += offset
  436.         self._GtkUI__updateAttention()
  437.  
  438.     
  439.     def __updateAttention(self):
  440.         '''
  441.         '''
  442.         widget = self.mainWindow
  443.         if self._GtkUI__attentionCounter != 0:
  444.             pass
  445.         widget.set_urgency_hint(not widget.is_active())
  446.  
  447.     
  448.     def _on_focus_changed(self, widget, event):
  449.         '''Gtk+ callback'''
  450.         self._GtkUI__updateAttention()
  451.  
  452.     
  453.     def _saveView(self, view, path):
  454.         '''
  455.         '''
  456.         if path is None:
  457.             error = None
  458.         else:
  459.             error = view.feedback.save(path)
  460.         if error is not None:
  461.             return error
  462.         self._GtkUI__saveGameDialogs.pop(view)
  463.  
  464.     
  465.     def __resize(self):
  466.         
  467.         try:
  468.             width = glchess.config.get('width')
  469.             height = glchess.config.get('height')
  470.         except glchess.config.Error:
  471.             return None
  472.  
  473.         self.mainWindow.resize(width, height)
  474.  
  475.     
  476.     def __applyConfig(self, name, value):
  477.         '''
  478.         '''
  479.         if name == 'width' or name == 'height':
  480.             self._GtkUI__resize()
  481.             return None
  482.         if name == 'show_toolbar':
  483.             toolbar = self._GtkUI__getWidget('toolbar')
  484.             if value is True:
  485.                 toolbar.show()
  486.             else:
  487.                 toolbar.hide()
  488.         elif name == 'enable_networking':
  489.             menuItem = self._GtkUI__getWidget('menu_play_online_item')
  490.             toolbarButton = self._GtkUI__getWidget('play_online_button')
  491.             if value is True:
  492.                 menuItem.show()
  493.                 toolbarButton.show()
  494.             else:
  495.                 menuItem.hide()
  496.                 toolbarButton.hide()
  497.         elif name == 'show_history':
  498.             box = self._GtkUI__getWidget('navigation_box')
  499.             if value is True:
  500.                 box.show()
  501.             else:
  502.                 box.hide()
  503.         elif name == 'maximised':
  504.             window = self.mainWindow
  505.             if value is True:
  506.                 window.maximize()
  507.             else:
  508.                 window.unmaximize()
  509.         elif name == 'fullscreen':
  510.             window = self.mainWindow
  511.             if value is True:
  512.                 window.fullscreen()
  513.             else:
  514.                 window.unfullscreen()
  515.         elif name == 'show_3d':
  516.             if value and not (chessview.haveGLSupport):
  517.                 title = _('Unable to enable 3D mode')
  518.                 errors = '\n'.join(chessview.openGLErrors)
  519.                 description = _('You are unable to play in 3D mode due to the following problems:\n%(errors)s\n\nPlease contact your system administrator to resolve these problems, until then you will be able to play chess in 2D mode.') % {
  520.                     'errors': errors }
  521.                 dialog = gtk.MessageDialog(type = gtk.MESSAGE_WARNING, message_format = title)
  522.                 dialog.format_secondary_text(description)
  523.                 dialog.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)
  524.                 dialog.run()
  525.                 dialog.destroy()
  526.                 glchess.config.set('show_3d', False)
  527.                 value = False
  528.             
  529.             self._GtkUI__renderGL = value
  530.             self._GtkUI__getWidget('menu_view_3d').set_active(value)
  531.             self.view.viewWidget.setRenderGL(value)
  532.         elif name == 'show_3d_smooth':
  533.             if not chessview.haveGLAccumSupport:
  534.                 value = False
  535.             
  536.             self.view.feedback.showSmooth(value)
  537.         elif name == 'show_comments':
  538.             self.view.setShowComments(value)
  539.         elif name == 'show_move_hints':
  540.             self.view.feedback.showMoveHints(value)
  541.         elif name == 'show_numbering':
  542.             self.view.feedback.showBoardNumbering(value)
  543.         elif name == 'move_format':
  544.             self.view.setMoveFormat(value)
  545.         elif name == 'promotion_type':
  546.             pass
  547.         elif name == 'board_view':
  548.             pass
  549.         elif not False:
  550.             raise AssertionError, 'Unknown config item: %s' % name
  551.  
  552.     
  553.     def startAnimation(self):
  554.         '''Start the animation callback'''
  555.         if self._GtkUI__animationTimer is None:
  556.             self._GtkUI__lastTime = time.time()
  557.             self._GtkUI__animationTimer = gobject.timeout_add(10, self._GtkUI__animate)
  558.         
  559.  
  560.     
  561.     def __animate(self):
  562.         now = time.time()
  563.         step = now - self._GtkUI__lastTime
  564.         if step < 0:
  565.             step = 0
  566.         elif step > 1:
  567.             step = 1
  568.         
  569.         self._GtkUI__lastTime = now
  570.         animating = self.feedback.onAnimate(step)
  571.         if not animating:
  572.             self._GtkUI__animationTimer = None
  573.         
  574.         return animating
  575.  
  576.     
  577.     def __getWidget(self, name):
  578.         widget = self._gui.get_widget(name)
  579.         if not widget is not None:
  580.             raise AssertionError, 'Unable to find widget: %s' % name
  581.         return widget
  582.  
  583.     
  584.     def _on_white_time_paint(self, widget, event):
  585.         '''Gtk+ callback'''
  586.         self._GtkUI__drawTime(self.whiteTimeString, widget, (0, 0, 0), (1, 1, 1))
  587.  
  588.     
  589.     def _on_black_time_paint(self, widget, event):
  590.         '''Gtk+ callback'''
  591.         self._GtkUI__drawTime(self.blackTimeString, widget, (1, 1, 1), (0, 0, 0))
  592.  
  593.     
  594.     def __drawTime(self, text, widget, fg, bg):
  595.         '''
  596.         '''
  597.         if widget.state == gtk.STATE_INSENSITIVE:
  598.             alpha = 0.5
  599.         else:
  600.             alpha = 1
  601.         context = widget.window.cairo_create()
  602.         context.set_source_rgba(bg[0], bg[1], bg[2], alpha)
  603.         context.paint()
  604.         (_, _, w, h) = widget.get_allocation()
  605.         context.set_source_rgba(fg[0], fg[1], fg[2], alpha)
  606.         context.select_font_face('fixed', cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
  607.         context.set_font_size(0.6 * h)
  608.         (x_bearing, y_bearing, width, height, _, _) = context.text_extents(text)
  609.         context.move_to((w - width) / 2 - x_bearing, (h - height) / 2 - y_bearing)
  610.         context.show_text(text)
  611.         widget.set_size_request(int(width) + 6, -1)
  612.  
  613.     
  614.     def _on_toggle_3d_clicked(self, widget):
  615.         '''Gtk+ callback'''
  616.         if widget.get_active():
  617.             value = True
  618.         else:
  619.             value = False
  620.         glchess.config.set('show_3d', value)
  621.  
  622.     
  623.     def _on_show_logs_clicked(self, widget):
  624.         '''Gtk+ callback'''
  625.         window = self._gui.get_widget('log_window')
  626.         if widget.get_active():
  627.             window.present()
  628.         else:
  629.             window.hide()
  630.  
  631.     
  632.     def _on_history_combo_changed(self, widget):
  633.         '''Gtk+ callback'''
  634.         model = widget.get_model()
  635.         iter = widget.get_active_iter()
  636.         if iter is None:
  637.             return None
  638.         moveNumber = model.get_value(iter, 1)
  639.         if moveNumber == len(model) - 1:
  640.             moveNumber = -1
  641.         
  642.         haveMoves = len(model) > 1
  643.         for widget in ('first_move_button', 'prev_move_button'):
  644.             if haveMoves:
  645.                 pass
  646.             self._GtkUI__getWidget(widget).set_sensitive(moveNumber != 0)
  647.         
  648.         for widget in ('last_move_button', 'next_move_button'):
  649.             if haveMoves:
  650.                 pass
  651.             self._GtkUI__getWidget(widget).set_sensitive(moveNumber != -1)
  652.         
  653.         self.view._setMoveNumber(moveNumber)
  654.  
  655.     
  656.     def __selectMoveNumber(self, moveNumber):
  657.         '''FIXME
  658.         '''
  659.         combo = self._GtkUI__getWidget('history_combo')
  660.         maxNumber = len(combo.get_model())
  661.         if moveNumber < 0:
  662.             moveNumber = maxNumber + moveNumber
  663.         
  664.         if moveNumber < 0:
  665.             moveNumber = 0
  666.         
  667.         if moveNumber >= maxNumber:
  668.             moveNumber = maxNumber - 1
  669.         
  670.         combo.set_active(moveNumber)
  671.  
  672.     
  673.     def __selectMoveNumberRelative(self, offset):
  674.         '''FIXME
  675.         '''
  676.         combo = self._GtkUI__getWidget('history_combo')
  677.         selected = combo.get_active()
  678.         maxNumber = len(combo.get_model())
  679.         new = selected + offset
  680.         if new < 0:
  681.             new = 0
  682.         elif new >= maxNumber:
  683.             new = maxNumber - 1
  684.         
  685.         self._GtkUI__selectMoveNumber(new)
  686.  
  687.     
  688.     def _on_history_start_clicked(self, widget):
  689.         '''Gtk+ callback'''
  690.         self._GtkUI__selectMoveNumber(0)
  691.  
  692.     
  693.     def _on_history_previous_clicked(self, widget):
  694.         '''Gtk+ callback'''
  695.         self._GtkUI__selectMoveNumberRelative(-1)
  696.  
  697.     
  698.     def _on_history_next_clicked(self, widget):
  699.         '''Gtk+ callback'''
  700.         self._GtkUI__selectMoveNumberRelative(1)
  701.  
  702.     
  703.     def _on_history_latest_clicked(self, widget):
  704.         '''Gtk+ callback'''
  705.         self._GtkUI__selectMoveNumber(-1)
  706.  
  707.     
  708.     def _updateViewButtons(self):
  709.         '''
  710.         '''
  711.         if self.view is not None:
  712.             pass
  713.         enable = self.view.isPlayable
  714.         for widget in ('save_game_button', 'menu_save_item', 'menu_save_as_item'):
  715.             self._GtkUI__getWidget(widget).set_sensitive(enable)
  716.         
  717.         combo = self._GtkUI__getWidget('history_combo')
  718.         if self.view is None:
  719.             if combo.get_model() != None:
  720.                 combo.set_model(None)
  721.             
  722.         else:
  723.             (model, selected) = self.view._getModel()
  724.             combo.set_model(model)
  725.             if selected < 0:
  726.                 selected = len(model) + selected
  727.             
  728.             combo.set_active(selected)
  729.         self._GtkUI__getWidget('navigation_box').set_sensitive(enable)
  730.         if enable:
  731.             pass
  732.         enable = self.view.gameResult is None
  733.  
  734.     
  735.     def _on_new_game_button_clicked(self, widget):
  736.         '''Gtk+ callback'''
  737.         if self.newGameDialog:
  738.             self.newGameDialog.window.present()
  739.         else:
  740.             self.newGameDialog = dialogs.GtkNewGameDialog(self, self._GtkUI__playerModel)
  741.  
  742.     
  743.     def _on_join_game_button_clicked(self, widget):
  744.         '''Gtk+ callback'''
  745.         self.feedback.onNewNetworkGame()
  746.  
  747.     
  748.     def _on_open_game_button_clicked(self, widget):
  749.         '''Gtk+ callback'''
  750.         if self.loadGameDialog:
  751.             self.loadGameDialog.window.present()
  752.         else:
  753.             self.loadGameDialog = dialogs.GtkLoadGameDialog(self)
  754.  
  755.     
  756.     def _on_save_game_button_clicked(self, widget):
  757.         '''Gtk+ callback'''
  758.         if self.view.feedback.getFileName() is not None:
  759.             self.view.feedback.save()
  760.             return None
  761.         
  762.         try:
  763.             dialog = self._GtkUI__saveGameDialogs[self.view]
  764.         except KeyError:
  765.             self.view.feedback.getFileName() is not None
  766.             self.view.feedback.getFileName() is not None
  767.             dialog = self._GtkUI__saveGameDialogs[self.view] = dialogs.GtkSaveGameDialog(self, self.view)
  768.         except:
  769.             self.view.feedback.getFileName() is not None
  770.  
  771.         dialog.window.present()
  772.  
  773.     
  774.     def _on_save_as_game_button_clicked(self, widget):
  775.         '''Gtk+ callback'''
  776.         
  777.         try:
  778.             dialog = self._GtkUI__saveGameDialogs[self.view]
  779.         except KeyError:
  780.             dialog = self._GtkUI__saveGameDialogs[self.view] = dialogs.GtkSaveGameDialog(self, self.view, self.view.feedback.getFileName())
  781.  
  782.         dialog.window.present()
  783.  
  784.     
  785.     def _on_undo_move_clicked(self, widget):
  786.         '''Gtk+ callback'''
  787.         self.view.feedback.undo()
  788.  
  789.     
  790.     def _on_resign_clicked(self, widget):
  791.         '''Gtk+ callback'''
  792.         self.view.feedback.resign()
  793.  
  794.     
  795.     def _on_claim_draw_clicked(self, widget):
  796.         '''Gtk+ callback'''
  797.         if self.view.feedback.claimDraw():
  798.             return None
  799.         title = _('Unable to claim draw')
  800.         message = _('You may claim a draw when:\na) The board has been in the same state three times (Three fold repetition)\nb) Fifty moves have occured where no pawn has moved and no piece has been captured (50 move rule)')
  801.         dialog = gtk.MessageDialog(flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, type = gtk.MESSAGE_WARNING, message_format = title)
  802.         dialog.format_secondary_text(message)
  803.         dialog.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_ACCEPT)
  804.         dialog.run()
  805.         dialog.destroy()
  806.  
  807.     
  808.     def _on_preferences_clicked(self, widget):
  809.         '''Gtk+ callback'''
  810.         self.preferences.setVisible(True)
  811.  
  812.     
  813.     def _on_help_clicked(self, widget):
  814.         '''Gtk+ callback'''
  815.         
  816.         try:
  817.             gtk.show_uri(self.mainWindow.get_screen(), 'ghelp:glchess', gtk.get_current_event_time())
  818.         except gobject.GError:
  819.             e = None
  820.             print _('Unable to display help: %s') % str(e)
  821.  
  822.  
  823.     
  824.     def _on_view_fullscreen_clicked(self, widget):
  825.         '''Gtk+ callback'''
  826.         glchess.config.set('fullscreen', True)
  827.  
  828.     
  829.     def _on_view_unfullscreen_clicked(self, widget):
  830.         '''Gtk+ callback'''
  831.         glchess.config.set('fullscreen', False)
  832.  
  833.     
  834.     def _on_3d_support_dialog_delete_event(self, widget, event):
  835.         '''Gtk+ callback'''
  836.         return True
  837.  
  838.     
  839.     def _on_3d_support_dialog_response(self, widget, responseId):
  840.         '''Gtk+ callback'''
  841.         if self._GtkUI__aboutDialog is not None:
  842.             return None
  843.         widget.hide()
  844.         return False
  845.  
  846.     
  847.     def _on_about_clicked(self, widget):
  848.         '''Gtk+ callback'''
  849.         if self._GtkUI__aboutDialog is not None:
  850.             return None
  851.         dialog.set_transient_for(self.mainWindow)
  852.         dialog.set_name(APPNAME)
  853.         dialog.set_version(VERSION)
  854.         dialog.set_copyright(COPYRIGHT)
  855.         dialog.set_license(LICENSE[0] + '\n\n' + LICENSE[1] + '\n\n' + LICENSE[2])
  856.         dialog.set_wrap_license(True)
  857.         dialog.set_comments(DESCRIPTION)
  858.         dialog.set_authors(AUTHORS)
  859.         dialog.set_artists(ARTISTS)
  860.         dialog.set_translator_credits(_('translator-credits'))
  861.         dialog.set_website(WEBSITE)
  862.         dialog.set_website_label(WEBSITE_LABEL)
  863.         dialog.set_logo_icon_name(ICON_NAME)
  864.         dialog.connect('response', self._on_glchess_about_dialog_close)
  865.         dialog.show()
  866.  
  867.     
  868.     def _on_glchess_about_dialog_close(self, widget, event):
  869.         '''Gtk+ callback'''
  870.         self._GtkUI__aboutDialog.destroy()
  871.         self._GtkUI__aboutDialog = None
  872.         return False
  873.  
  874.     
  875.     def _on_log_window_delete_event(self, widget, event):
  876.         '''Gtk+ callback'''
  877.         self._gui.get_widget('menu_view_logs').set_active(False)
  878.         return True
  879.  
  880.     
  881.     def _on_resize(self, widget, event):
  882.         '''Gtk+ callback'''
  883.         if self.isMaximised or self.isFullscreen:
  884.             return None
  885.         self.width = event.width
  886.         self.height = event.height
  887.  
  888.     
  889.     def _on_window_state_changed(self, widget, event):
  890.         '''Gtk+ callback'''
  891.         if event.changed_mask & gtk.gdk.WINDOW_STATE_MAXIMIZED:
  892.             self.isMaximised = event.new_window_state & gtk.gdk.WINDOW_STATE_MAXIMIZED != 0
  893.             glchess.config.set('maximised', self.isMaximised)
  894.         
  895.         if event.changed_mask & gtk.gdk.WINDOW_STATE_FULLSCREEN:
  896.             self.isFullscreen = event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN != 0
  897.             if self.isFullscreen:
  898.                 self._gui.get_widget('menu_fullscreen').hide()
  899.                 self._gui.get_widget('menu_leave_fullscreen').show()
  900.             else:
  901.                 self._gui.get_widget('menu_leave_fullscreen').hide()
  902.                 self._gui.get_widget('menu_fullscreen').show()
  903.         
  904.  
  905.     
  906.     def _on_close_window(self, widget, event):
  907.         '''Gtk+ callback'''
  908.         self.feedback.onQuit()
  909.         return True
  910.  
  911.     
  912.     def _on_menu_quit(self, widget):
  913.         '''Gtk+ callback'''
  914.         self.feedback.onQuit()
  915.  
  916.  
  917. if __name__ == '__main__':
  918.     ui = GtkUI()
  919.     ui.run()
  920.  
  921.